/**
 * Hash Table (哈希表) 实现
 * 
 * 哈希表是一种数据结构，它使用哈希函数将键映射到值。
 * 哈希表提供了快速的插入、删除和查找操作。
 * 
 * 时间复杂度：
 * - 插入: O(1) 平均情况
 * - 删除: O(1) 平均情况
 * - 查找: O(1) 平均情况
 * 
 * 空间复杂度: O(n)
 */

class HashTable {
  constructor(initialCapacity = 16, loadFactor = 0.75) {
    // TODO: 初始化哈希表
    // this.capacity = initialCapacity
    // this.loadFactor = loadFactor
    // this.size = 0
    // this.buckets = new Array(this.capacity).fill(null).map(() => [])
  }

  /**
   * 哈希函数
   * @param {string} key - 键
   * @returns {number} - 哈希值
   */
  hash(key) {
    // TODO: 实现哈希函数
    // 1. 将键转换为字符串
    // 2. 计算字符串的哈希值
    // 3. 使用模运算确保在容量范围内
  }

  /**
   * 插入键值对
   * @param {string} key - 键
   * @param {*} value - 值
   */
  set(key, value) {
    // TODO: 实现插入逻辑
    // 1. 计算键的哈希值
    // 2. 找到对应的桶
    // 3. 检查键是否已存在
    // 4. 如果存在，更新值；否则添加新的键值对
    // 5. 检查是否需要扩容
  }

  /**
   * 获取值
   * @param {string} key - 键
   * @returns {*} - 值或undefined
   */
  get(key) {
    // TODO: 实现获取逻辑
    // 1. 计算键的哈希值
    // 2. 找到对应的桶
    // 3. 在桶中查找键
    // 4. 返回对应的值或undefined
  }

  /**
   * 删除键值对
   * @param {string} key - 键
   * @returns {boolean} - 是否成功删除
   */
  delete(key) {
    // TODO: 实现删除逻辑
    // 1. 计算键的哈希值
    // 2. 找到对应的桶
    // 3. 在桶中查找键
    // 4. 如果找到，删除键值对并返回true
    // 5. 否则返回false
  }

  /**
   * 检查键是否存在
   * @param {string} key - 键
   * @returns {boolean} - 是否存在
   */
  has(key) {
    // TODO: 实现检查键是否存在逻辑
    // 1. 计算键的哈希值
    // 2. 找到对应的桶
    // 3. 在桶中查找键
    // 4. 返回是否存在
  }

  /**
   * 获取所有键
   * @returns {Array} - 所有键的数组
   */
  keys() {
    // TODO: 实现获取所有键逻辑
    // 1. 遍历所有桶
    // 2. 收集所有键
    // 3. 返回键数组
  }

  /**
   * 获取所有值
   * @returns {Array} - 所有值的数组
   */
  values() {
    // TODO: 实现获取所有值逻辑
    // 1. 遍历所有桶
    // 2. 收集所有值
    // 3. 返回值数组
  }

  /**
   * 获取所有键值对
   * @returns {Array} - 所有键值对的数组
   */
  entries() {
    // TODO: 实现获取所有键值对逻辑
    // 1. 遍历所有桶
    // 2. 收集所有键值对
    // 3. 返回键值对数组
  }

  /**
   * 获取哈希表大小
   * @returns {number} - 大小
   */
  size() {
    // TODO: 实现获取大小逻辑
    // 1. 返回当前存储的键值对数量
  }

  /**
   * 检查哈希表是否为空
   * @returns {boolean} - 是否为空
   */
  isEmpty() {
    // TODO: 实现检查是否为空逻辑
    // 1. 检查大小是否为0
  }

  /**
   * 清空哈希表
   */
  clear() {
    // TODO: 实现清空逻辑
    // 1. 重置所有桶
    // 2. 重置大小
  }

  /**
   * 扩容
   */
  resize() {
    // TODO: 实现扩容逻辑
    // 1. 保存旧的桶
    // 2. 创建新的桶数组
    // 3. 重新计算所有键值对的哈希值
    // 4. 将键值对插入到新的桶中
  }

  /**
   * 获取负载因子
   * @returns {number} - 负载因子
   */
  getLoadFactor() {
    // TODO: 实现获取负载因子逻辑
    // 1. 计算当前负载因子
    // 2. 返回负载因子值
  }

  /**
   * 获取哈希表容量
   * @returns {number} - 容量
   */
  getCapacity() {
    // TODO: 实现获取容量逻辑
    // 1. 返回当前容量
  }
}

module.exports = HashTable
